package com.shawn.springboot.integeration.common.config.swagger;

import com.shawn.springboot.integeration.common.properties.SwaggerProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.Date;

/**
 * @author shawn
 * @description: Swagger 配置
 * @date 2023/12/24
 */
@Configuration
@EnableConfigurationProperties(SwaggerProperty.class)
public class SwaggerConfig {
    @Resource
    private SwaggerProperty property;
    // 创建 API 文档
    @Bean
    public Docket createApiDoc() {
    // 创建Docket 对象，指定了文档类型为 OpenAPI 3.0
    return new Docket(DocumentationType.OAS_30)
        // 设置 API 文档的基本信息
        .apiInfo(apiInfo())
        // 设置 API 文档的分组名称
        .groupName(property.getGroupName())
        // 设置是否启用 API 文档
        .enable(property.getEnable())
        // 进入选择器配置，用于筛选扫描的接口
        .select()
        // 指定需要扫描的 API 接口包
        .apis(RequestHandlerSelectors.basePackage(property.getScanPackage()))
        // 构建 Docket 对象，并进行一些其他的配置
        .build().directModelSubstitute(Timestamp.class, Date.class);
    }

    // 构建 API 信息
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            //  设置 API 文档的标题
            .title(property.getTitle())
            //  设置 API 文档的描述
            .description(property.getDescribe())
            //  设置 API 文档的版本号
            .version(property.getVersion())
            //  设置服务条款的 URL
            .termsOfServiceUrl(property.getTermsOfServiceUrl())
            //  设置联系人信息
            .contact(new Contact(property.getContactName(),
              property.getContactUrl(), property.getContactEmail()))
            .build();
    }
}
